package quiz

import org.springframework.cloud.contract.spec.Contract

[Contract.make {
    request {
        method("GET")
        url("/api/v3/quizzes") {
            queryParameters {
                parameter("page", 1)
                parameter("size", 10)
                parameter("type", "makerId")
                parameter("content", "")
                parameter("quizType", "SUBJECTIVE_QUIZ")
            }
        }
        headers {
            contentType(applicationJsonUtf8())
            header('id', '21')
        }
    }
    response {
        status(200)
        body("""
            {
                "content":[
                    {
                        "id":1,
                        "description":"description",
                        "makerId":1,
                        "referenceNumber":1,
                        "isAvailable":true,
                        "quizGroupId":1,
                        "remark":"remark"
                    }
                ],
                "totalElements": 3,
                "totalPages": 1,
                "size": 10,
                "number": 0
            }
        """)
        bodyMatchers {
            jsonPath('$.content[*]', byType())
            jsonPath('$.content[*].id', byRegex(number()))
            jsonPath('$.content[*].description', byRegex("[\\s\\S]+"))
            jsonPath('$.content[*].makerId', byRegex(number()))
            jsonPath('$.content[*].referenceNumber', byRegex(number()))
            jsonPath('$.content[*].isAvailable', byRegex(anyBoolean()))
            jsonPath('$.content[*].quizGroupId', byRegex(number()))
            jsonPath('$.content[*].remark', byRegex("[\\s\\S]+"))
            jsonPath('$.totalElements', byRegex(number()))
            jsonPath('$.totalPages', byRegex(number()))
            jsonPath('$.size', byRegex(number()))
            jsonPath('$.number', byRegex(number()))
        }
        headers {
            contentType(applicationJsonUtf8())
        }
    }
},
 Contract.make {
     request {
         method("GET")
         url("/api/v3/quizzes") {
             queryParameters {
                 parameter("page", 1)
                 parameter("size", 10)
                 parameter("type", "makerId")
                 parameter("content", "")
                 parameter("quizType", "LOGIC_QUIZ")
             }
         }
         headers {
             contentType(applicationJsonUtf8())
             header('id', '21')
         }
     }
     response {
         status(200)
         body("""
            {
                "content":[
                    {
                        "hardCount":2,
                        "normalCount":8,
                        "easyCount":4,
                        "timeBoxInMinutes":20   
                    }
                ],
                "totalElements": 3,
                "totalPages": 1,
                "size": 10,
                "number": 0
                
            }
        """)
         bodyMatchers {
             jsonPath('$.content[*]', byType())
             jsonPath('$.content[*].hardCount', byRegex(number()))
             jsonPath('$.content[*].normalCount', byRegex(number()))
             jsonPath('$.content[*].easyCount', byRegex(number()))
             jsonPath('$.content[*].timeBoxInMinutes', byRegex(number()))
             jsonPath('$.totalElements', byRegex(number()))
             jsonPath('$.totalPages', byRegex(number()))
             jsonPath('$.size', byRegex(number()))
             jsonPath('$.number', byRegex(number()))
         }
         headers {
             contentType(applicationJsonUtf8())
         }
     }
 },
 Contract.make {
     request {
         method("GET")
         url("/api/v3/quizzes") {
             queryParameters {
                 parameter("page", 1)
                 parameter("size", 10)
                 parameter("type", "makerId")
                 parameter("content", "")
                 parameter("quizType", "HOMEWORK_QUIZ")
             }
         }
         headers {
             contentType(applicationJsonUtf8())
             header('id', '21')
         }
     }
     response {
         status(200)
         body("""
            {
                "content":[
                    {                   
                        "id": 1,
                        "description": "编程题",
                        "evaluateScript": "/homework-script/check-readme.sh",
                        "templateRepository": "",
                        "makerId": 1,
                        "homeworkName": "homework",
                        "answerPath": "/homework-answer/check-readme",
                        "stackId": 1,
                        "rawId": 1,
                        "answerDescription": "",
                        "updateTime": "2018-01-02",
                        "tags": [] 
                    }
                ],
                "totalElements": 3,
                "totalPages": 1,
                "size": 10,
                "number": 0
            }
        """)
         bodyMatchers {
             jsonPath('$.content[*]', byType())
             jsonPath('$.content[*].id', byRegex(number()))
             jsonPath('$.content[*].description', byRegex(nonBlank()))
             jsonPath('$.content[*].evaluateScript', byRegex(nonBlank()))
             jsonPath('$.content[*].templateRepository', byType())
             jsonPath('$.content[*].makerId', byRegex(number()))
             jsonPath('$.content[*].homeworkName', byType())
             jsonPath('$.content[*].answerPath', byRegex(nonBlank()))
             jsonPath('$.content[*].stackId', byRegex(number()))
             jsonPath('$.content[*].rawId', byRegex(number()))
             jsonPath('$.content[*].answerDescription', byType())
             jsonPath('$.content[*].updateTime', byRegex(nonBlank()))
             jsonPath('$.content[*].tags', byType {
                 minOccurrence(0)
             })
             jsonPath('$.totalElements', byRegex(number()))
             jsonPath('$.totalPages', byRegex(number()))
             jsonPath('$.size', byRegex(number()))
             jsonPath('$.number', byRegex(number()))
         }
         headers {
             contentType(applicationJsonUtf8())
         }
     }
 },
 Contract.make {
     request {
         method("GET")
         url("/api/v3/quizzes") {
             queryParameters {
                 parameter("page", 1)
                 parameter("size", 10)
                 parameter("type", "makerId")
                 parameter("content", "")
                 parameter("quizType","BASIC_QUIZ")
             }
         }
         headers {
             contentType(applicationJsonUtf8())
             header('id', '21')
         }
     }
     response {
         status(200)
         body("""
            {
                "content":[
                    {
                        "id": 1,
                        "answer":"1",
                        "type":"SINGLE_CHOICE",
                        "description":"单选题",
                        "choices": ["0", "1", "2", "3"],
                        "available": true,
                        "tags": ["java"]
                    }
                ],
                "totalElements": 3,
                "totalPages": 1,
                "size": 10,
                "number": 0
            }
        """)
         bodyMatchers {
             jsonPath('$.content[*]', byType())
             jsonPath('$.content[*].id', byRegex(number()))
             jsonPath('$.content[*].answer', byType())
             jsonPath('$.content[*].type', byType())
             jsonPath('$.content[*].description', byType())
             jsonPath('$.content[*].choices', byType())
             jsonPath('$.content[*].available', byRegex(anyBoolean()))
             jsonPath('$.content[*].tags', byType {
                 minOccurrence(0)
             })
             jsonPath('$.totalElements', byRegex(number()))
             jsonPath('$.totalPages', byRegex(number()))
             jsonPath('$.size', byRegex(number()))
             jsonPath('$.number', byRegex(number()))
         }
         headers {
             contentType(applicationJsonUtf8())
         }
     }
 }
]
